package com.example.entity;

import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * AI聊天会话实体类
 * 用于管理用户与AI助手的对话会话信息
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatSession implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 会话ID
     */
    private String sessionId;
    
    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * 会话标题
     */
    private String title;
    
    /**
     * 对话消息列表
     */
    private List<ChatMessage> messages = new ArrayList<>();
    
    /**
     * 会话创建时间
     */
    private LocalDateTime createTime;
    
    /**
     * 最后活跃时间
     */
    private LocalDateTime lastActiveTime;
    
    /**
     * 会话状态：ACTIVE-活跃, ARCHIVED-已归档, DELETED-已删除
     */
    private String status = "ACTIVE";
    
    /**
     * 会话配置
     */
    private SessionConfig config = new SessionConfig();
    
    /**
     * 聊天消息内部类
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class ChatMessage implements Serializable {
        private static final long serialVersionUID = 1L;
        
        /**
         * 消息角色：system, user, assistant
         */
        private String role;
        
        /**
         * 消息内容
         */
        private String content;
        
        /**
         * 消息时间戳
         */
        private LocalDateTime timestamp;
        
        /**
         * 消息唯一标识
         */
        private String messageId;
    }
    
    /**
     * 会话配置内部类
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class SessionConfig implements Serializable {
        private static final long serialVersionUID = 1L;
        
        /**
         * 系统提示词
         */
        private String systemPrompt = "你是DeepSeek智能助手，专门为在线考试管理系统提供帮助。你可以协助用户解答关于考试创建、题目管理、成绩分析等相关问题。请以友好、专业的方式回答用户问题。";
        
        /**
         * 最大上下文长度
         */
        private int maxContextLength = 20;
        
        /**
         * 会话过期时间（小时）
         */
        private int sessionExpiryHours = 24;
        
        /**
         * 是否启用上下文管理
         */
        private boolean enableContextManagement = true;
    }
    
    /**
     * 添加消息到会话
     */
    public void addMessage(String role, String content) {
        ChatMessage message = new ChatMessage();
        message.setRole(role);
        message.setContent(content);
        message.setTimestamp(LocalDateTime.now());
        message.setMessageId(java.util.UUID.randomUUID().toString());
        
        this.messages.add(message);
        this.lastActiveTime = LocalDateTime.now();
        
        // 如果启用上下文管理，自动剪裁消息
        if (config.isEnableContextManagement() && messages.size() > config.getMaxContextLength()) {
            trimMessages();
        }
    }
    
    /**
     * 剪裁消息，保留系统消息和最近的对话
     */
    private void trimMessages() {
        List<ChatMessage> systemMessages = messages.stream()
                .filter(msg -> "system".equals(msg.getRole()))
                .toList();
        
        List<ChatMessage> recentMessages = messages.stream()
                .filter(msg -> !"system".equals(msg.getRole()))
                .skip(Math.max(0, messages.size() - config.getMaxContextLength() + systemMessages.size()))
                .toList();
        
        this.messages = new ArrayList<>();
        this.messages.addAll(systemMessages);
        this.messages.addAll(recentMessages);
    }
    
    /**
     * 获取用于API调用的消息列表
     */
    public List<ChatMessage> getApiMessages() {
        return new ArrayList<>(this.messages);
    }
    
    /**
     * 检查会话是否过期
     */
    public boolean isExpired() {
        if (lastActiveTime == null) {
            return true;
        }
        return lastActiveTime.isBefore(LocalDateTime.now().minusHours(config.getSessionExpiryHours()));
    }
    
    /**
     * 更新会话标题（基于第一条用户消息）
     */
    public void updateTitle() {
        if (title == null || title.isEmpty()) {
            messages.stream()
                    .filter(msg -> "user".equals(msg.getRole()))
                    .findFirst()
                    .ifPresent(msg -> {
                        String content = msg.getContent();
                        // 截取前30个字符作为标题
                        this.title = content.length() > 30 ? content.substring(0, 30) + "..." : content;
                    });
        }
    }
} 